package com.ias.business.testbiz.service.impl;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ias.business.testbiz.entity.TestBizEntity;
import com.ias.business.testbiz.mapper.TestBizMapper;
import com.ias.business.testbiz.service.TestBizService;
import com.ias.redis.support.CacheNames;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;

import java.time.LocalDateTime;

/**
 * 测试业务服务实现类
 * 演示动态数据源的使用
 * 
 * @author IAS Team
 * @since 1.0.0
 */
@Slf4j
@Service
public class TestBizServiceImpl extends ServiceImpl<TestBizMapper, TestBizEntity> implements TestBizService {

    /**
     * 分页查询测试业务 - 使用从库（读库）
     * 基于MyBatis-Plus 3.5.9优化，使用LambdaQueryWrapper提供类型安全
     * @DS注解指定使用slave数据源
     */
    @Override
    @DS("slave")
    @Cacheable(cacheNames = CacheNames.CACHE_60MINS, cacheManager = "L2_CacheManager", key = "'testbiz_keyword_'+#keyword", sync = true)
    public IPage<TestBizEntity> selectTestBizPage(Page<TestBizEntity> page, String keyword) {
        log.info("使用从库查询测试业务列表，关键词：{}", keyword);
        
        // 使用LambdaQueryWrapper替代QueryWrapper，提供类型安全和更好的IDE支持
        LambdaQueryWrapper<TestBizEntity> queryWrapper = Wrappers.lambdaQuery();
        
        if (StringUtils.hasText(keyword)) {
            // 使用lambda表达式，避免字段名硬编码
            queryWrapper.and(wrapper -> 
                wrapper.like(TestBizEntity::getBizName, keyword)
                    .or().like(TestBizEntity::getBizCode, keyword)
                    .or().like(TestBizEntity::getDescription, keyword)
            );
        }
        
        // 按创建时间倒序 - 使用lambda表达式
        queryWrapper.orderByDesc(TestBizEntity::getCreateTime);
        
        return baseMapper.selectPage(page, queryWrapper);
    }

    /**
     * 根据业务编码查询 - 使用从库（读库）
     * 基于MyBatis-Plus 3.5.9优化，使用LambdaQueryWrapper
     */
    @Override
    @DS("slave")
    public TestBizEntity getByBizCode(String bizCode) {
        log.info("使用从库根据业务编码查询：{}", bizCode);
        
        // 使用LambdaQueryWrapper替代QueryWrapper
        LambdaQueryWrapper<TestBizEntity> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(TestBizEntity::getBizCode, bizCode);
        
        return baseMapper.selectOne(queryWrapper);
    }

    /**
     * 统计业务数量 - 使用从库（读库）
     */
    @Override
    @DS("slave")
    public long countTestBiz() {
        log.info("使用从库统计测试业务数量");
        return baseMapper.selectCount(null);
    }

    /**
     * 更新业务状态 - 使用主库（写库）
     */
    @Override
    @DS("master")
    @Transactional(rollbackFor = Exception.class)
    public boolean updateStatus(Long id, Integer status) {
        log.info("使用主库更新业务状态，ID：{}，状态：{}", id, status);
        
        TestBizEntity entity = baseMapper.selectById(id);
        if (entity == null) {
            log.warn("业务实体不存在，ID：{}", id);
            return false;
        }
        
        entity.setStatus(status);
        entity.setUpdateTime(LocalDateTime.now());
        
        int result = baseMapper.updateById(entity);
        log.info("更新业务状态结果：{}", result > 0 ? "成功" : "失败");
        
        return result > 0;
    }

    /**
     * 保存测试业务 - 使用主库（写库）
     */
    @Override
    @DS("master")
    @Transactional(rollbackFor = Exception.class)
    public boolean save(TestBizEntity entity) {
        log.info("使用主库保存测试业务：{}", entity.getBizName());
        
        entity.setCreateTime(LocalDateTime.now());
        entity.setUpdateTime(LocalDateTime.now());
        
        return super.save(entity);
    }

    /**
     * 更新测试业务 - 使用主库（写库）
     */
    @Override
    @DS("master")
    @Transactional(rollbackFor = Exception.class)
    public boolean updateById(TestBizEntity entity) {
        log.info("使用主库更新测试业务：{}", entity.getId());
        
        entity.setUpdateTime(LocalDateTime.now());
        
        return super.updateById(entity);
    }




} 